package com.dc.juc.example._12_future;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.*;

/**
 * Description: Future
 *
 *  Future代表的是异步执行的结果，意思是当异步执行结束之后，返回的结果将会保存在Future中
 *
 * @author: gdc
 * @date: 2021/8/17
 * @version 1.0
 */
@Slf4j
public class _1_Future {

    @SneakyThrows
    public static void main(String[] args){
        log.info("初始化...");
        ExecutorService threadPool = Executors.newCachedThreadPool();

        // 调用线程执行，并将执行结果存放到Future中
        Future<String> future = threadPool.submit(new MyCallable());
        TimeUnit.SECONDS.sleep(5);
        log.info("执行主方法中的业务...");

        // 获取异步执行结果
        String result = future.get();
        log.info("获取Callable的返回结果:{}", result);
        threadPool.shutdown();
    }

    /**
     * 自定义
     */
    private static class MyCallable implements Callable<String> {

        /**
         * 有返回值，并可以抛出异常
         */
        @Override
        public String call() throws Exception {
            TimeUnit.SECONDS.sleep(3);

            log.info("执行callable方法中的业务...");

            // 返回结果
            return "Done";
        }
    }


}
